<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // promise 
        // 回调地狱 ：回调函数出现层层嵌套 
        // promise使用 ：1.三种状态 pendding fulfilled rejected
        // 2.2种回调 onResolved  和 onRejected
        // 3.then的三种返还值 
        // Promise.resolve  reject race all allSettled finally catch
        // then 是一个微任务 
    //     function fn(){
    //         return new Promise((resolve,reject)=>{
    //             // setTimeout(() => {
    //                 resolve("success");
    //                 // reject("err");
    //         //  }, 1000);
    //         })
    //     }
    //    let res =  fn().then(res=>{
    //         // return 11111
    //         return new Promise(resolve=>{
    //             resolve(2222);
    //         })
    //     })
    //     console.log(res);

        // fn().then(res=>{
        //     console.log(res);
        // },err=>{
        //     console.log("err",err);
        // })
        // 链式操作，无限链式
        // fn().then(res=>{
        //     console.log(111);
        //     return fn();
        // }).then(res=>{
        //     console.log(222);
        //     return fn();
        // }).then(res=>{
        //     console.log(3333);
        // })
        // fn(function(){
        //     console.log(1111);
        //     fn(function(){
        //         console.log(2222);
        //         fn(function(){
        //             console.log(3333);
        //         })
        //     })
        // })
        // console.log(222);
        // fn(function(){
        //     console.log(111)
        // })
        // fn(function(){
        //     console.log(222)
        // })
        // fn(function(){
        //     console.log(333)
        // })


// 微任务 和宏任务
// 111 --> 555->222->333->444->666
// 111->222--->555->333->444->666
// 同步和异步  先执行同步任务 在异步
// 异步 分成 微任务 和 宏任务 
// 同步任务 广义上说也是异步任务
// 所有的同步代码 会放在一个大的宏任务里执行 主线程 （script）
// 【主线程宏任务(script)[微任务队列]】【宏任务[....]】【宏任务[]】【】【】【】【】
// 【script[then]】【settimeout[]】【settimeout[]】....

// 微任务 出现为了解决 精度问题 
// 
// 【1】【2】【3】【4】【5】 【6】
// MutationObserver then
// [1] [2] [3] [6] [4] [5]
console.log(111)
let p = new Promise(resolve=>{
    console.log(222)
    resolve();
})
setTimeout(() => {
    console.log(4444)
});
p.then(()=>{  // 微任务 
    console.log(333);
})
setTimeout(()=>{
    console.log(6666);
})
console.log(5555);


    </script>
</body>
</html>